#ifndef TYPES_H
#define TYPES_H
#include <limits>
class QPushButton;
class QColor;
class QPointF;
class QString;
typedef double qreal;
static const double Pi = 3.14159265358979323846264338327950288419717;
static const double TwoPi = 2.0 * Pi;
static const bool DEBUG = true;
static const short MAX_ROADS = 30;
static const short MAX_GLOBAL_INTENSITY = 10000;
static const short MAX_BRANCH_INTENSITY = 600;   // czyli 10 na sekundę

enum Direction {entry, outlet};
enum Dependence {none, connected, glued};
enum RailBed {ongrass, onroad};     // what is under the rails
enum BarrierType {changelane, exitroundabout, enterroundabout, shortcut, shortcutend};
enum Manouver {forward, turning, changing};

int plusModulo(int a, int b, int mod);
int minusModulo(int a, int b, int mod);
double normalizeAngle(double angle);
double normalizeDegAngle(double angle);
void movePoints(QPointF *P1, QPointF *P2, double d);
bool CCW(QPointF A, QPointF B, QPointF C);
void changeButtonTextColor(QPushButton *but, QColor color);
void removeGroupSettings(QString nazwa);
bool ValidQReal(qreal value);
void debug(QString);

#endif // TYPES_H

/*!
@enum Direction Charakterystyka danej gałęzi. Może być wjazdem lub zjazdem.
@enum Dependence Zależność między sąsiadującymi ze sobą gałąziami.*/
/** @var Dependence connected
  * Wartość charakterystyczna dla zjazdów. Jeżeli zjazd jest "połączony" z sąsiadem, to zostaje rysowane bezpośrednie połączenie między nimi. Umożliwia one przejazd do celu bez wjazdu na rodno. */
/** @var Dependence glued
  * Wartość charakterystyczna dla wjazdów. Jeżeli wjazd jest "sklejony" z sąsiadem, to zostaje narysowany tuż obok niego. Obie gałęzie stanowią jedną ulicę i są rozdzielone podwójną linią ciągłą. Do rysowania jest wykorzystane fi (kąt odchylenia) sąsiada. */
/** @enum BarrierType
 * Rodzaj barier, jakie mogą napotakć samochody w swej odwiecznej wędrówce. */
/** @var BarrierType changelane
 * W tym miejscu samochód może zmienić pas.*/
/** @var BarrierType exitroundabout
 * W tym miejscu można zjechać z ronda. */
/** @var BarrierType enterroundabout
 * ... wjechać na rondo. */
/** @var BarrierType shortcut
 * Oznacza możliwość pojechania skrótem. */
/** @var BarrierType shortcutend
 * Oznacza koniec skrótu i konieczność wjechania na gałąź. */
/**
@enum Manouver Zdefiniowany w types.h. */
/** @var Manouver turning
Samochód wykonuje skręt bądź w celu wjechania, lub zjechania z ronda.*/
/** @var Manouver changing
Operacja zmiany pasa. */
/** @var Manouver forward
'Najprostszy' stan. Na gałęzi oznacza po prostu jazdę na przód, na obręczy ronda: jazdę dookoła na swoim pasie.
*/
